/* 由 ecpg 处理（回归模式） */
/* 这些包含文件由预处理器添加 */
#include <ecpglib.h>
#include <ecpgerrno.h>
#include <sqlca.h>
/* 需要用于 informix 兼容性 */
#include <ecpg_informix.h>
/* 自动包含部分结束 */
#define ECPGdebug(X,Y) ECPGdebug((X)+100,(Y))

#line 1 "rfmtdate.pgc"
#include <stdio.h>
#include <stdlib.h>
#include <pgtypes_error.h>
#include <sqltypes.h>

/*
 * 该文件通过
 * rfmtdate / rdefmtdate / rstrdate 测试各种日期输入/输出格式
 */


static void fc_check_return(int fc_ret);

static void fc_date_test_strdate(const char *fc_input)
{
	static int fc_i;
	date fc_d;
	int fc_r, fc_q;
	char fc_dbuf[11];

	fc_r = rstrdate(fc_input, &fc_d);
	printf("r: %d ", fc_r);
	if (fc_r == 0)
	{
		fc_q = rdatestr(fc_d, fc_dbuf);
		printf("q: %d ", fc_q);
		if (fc_q == 0)
		{
			printf("date %d: %s\n", fc_i++, fc_dbuf);
		}
		else
			printf("\n");
	}
	else
		fc_check_return(fc_r);
}

static void fc_date_test_defmt(const char *fc_fmt, const char *fc_input)
{
	static int fc_i;
	char fc_dbuf[11];
	date fc_d;
	int fc_q, fc_r;

	fc_r = rdefmtdate(&fc_d, fc_fmt, fc_input);
	printf("r: %d ", fc_r);
	if (fc_r == 0)
	{
		fc_q = rdatestr(fc_d, fc_dbuf);
		printf("q: %d ", fc_q);
		if (fc_q == 0)
		{
			printf("date %d: %s\n", fc_i++, fc_dbuf);
		}
		else
			printf("\n");
	}
	else
		fc_check_return(fc_r);
}

static void fc_date_test_fmt(date fc_d, const char *fc_fmt)
{
	static int fc_i;
	char fc_buf[200];
	int fc_r;

	fc_r = rfmtdate(fc_d, fc_fmt, fc_buf);
	printf("r: %d ", fc_r);
	if (fc_r != 0)
		fc_check_return(fc_r);
	else
		printf("date: %d: %s\n", fc_i++, fc_buf);
}


int main(void)
{
	short fc_mdy[3] = { 11, 23, 1959 };
	char fc_dbuf[11];
	date fc_d;
	int fc_r;

	ECPGdebug(1, stderr);

	fc_r = rmdyjul(fc_mdy, &fc_d);
	printf("create: r: %d\n", fc_r);
	if (fc_r == 0)
	{
		rdatestr(fc_d, fc_dbuf);
		printf("date: %s\n", fc_dbuf);
	}

	/* 输入掩码为 mmddyyyy */
	fc_date_test_strdate("12031994");
	fc_date_test_strdate("9.6.1994");

	fc_date_test_fmt(fc_d, "mmddyy");
	fc_date_test_fmt(fc_d, "ddmmyy");
	fc_date_test_fmt(fc_d, "yymmdd");
	fc_date_test_fmt(fc_d, "yy/mm/dd");
	fc_date_test_fmt(fc_d, "yy mm dd");
	fc_date_test_fmt(fc_d, "yy.mm.dd");
	fc_date_test_fmt(fc_d, ".mm.yyyy.dd.");
	fc_date_test_fmt(fc_d, "mmm. dd, yyyy");
	fc_date_test_fmt(fc_d, "mmm dd yyyy");
	fc_date_test_fmt(fc_d, "yyyy dd mm");
	fc_date_test_fmt(fc_d, "ddd, mmm. dd, yyyy");
	fc_date_test_fmt(fc_d, "(ddd) mmm. dd, yyyy");

	fc_date_test_defmt("ddmmyy", "21-2-54");
	fc_date_test_defmt("ddmmyy", "2-12-54");
	fc_date_test_defmt("ddmmyy", "20111954");
	fc_date_test_defmt("ddmmyy", "130464");
	fc_date_test_defmt("mmm.dd.yyyy", "MAR-12-1967");
	fc_date_test_defmt("yy/mm/dd", "1954, February 3rd");
	fc_date_test_defmt("mmm.dd.yyyy", "041269");
	fc_date_test_defmt("yy/mm/dd", "In the year 2525, in the month of July, mankind will be alive on the 28th day");
	fc_date_test_defmt("dd-mm-yy", "I said on the 28th of July in the year 2525");
	fc_date_test_defmt("mmm.dd.yyyy", "9/14/58");
	fc_date_test_defmt("yy/mm/dd", "47/03/29");
	fc_date_test_defmt("mmm.dd.yyyy", "oct 28 1975");
	fc_date_test_defmt("mmddyy", "Nov 14th, 1985");
	/* 正确：仍包含 dd mm yy */
	fc_date_test_defmt("bladdfoommbaryybong", "20/11/1954");
	/* 1994 不是闰年，它接受的日期为 01-03-1994 */
	fc_date_test_defmt("ddmmyy", "29-02-1994");

	/* ECPG_INFORMIX_ENOTDMY，需要“dd”，“mm”和“yy” */
	fc_date_test_defmt("dmy", "20/11/1954");

	/* ECPG_INFORMIX_ENOSHORTDATE */
	fc_date_test_defmt("ddmmyy", "21254");
	fc_date_test_defmt("ddmmyy", "    21254    ");

	/* ECPG_INFORMIX_BAD_DAY */
	fc_date_test_defmt("ddmmyy", "320494");

	/* ECPG_INFORMIX_BAD_MONTH */
	fc_date_test_defmt("mm-yyyy-dd", "13-1993-21");

	/* ECPG_INFORMIX_BAD_YEAR */
	/* ??? */

	return 0;
}

static void fc_check_return(int fc_ret)
{
	switch(fc_ret)
	{
		case ECPG_INFORMIX_ENOTDMY:
			printf("(ECPG_INFORMIX_ENOTDMY)");
			break;
		case ECPG_INFORMIX_ENOSHORTDATE:
			printf("(ECPG_INFORMIX_ENOSHORTDATE)");
			break;
		case ECPG_INFORMIX_BAD_DAY:
			printf("(ECPG_INFORMIX_BAD_DAY)");
			break;
		case ECPG_INFORMIX_BAD_MONTH:
			printf("(ECPG_INFORMIX_BAD_MONTH)");
			break;
		default:
			printf("(unknown ret: %d)", fc_ret);
			break;
	}
	printf("\n");
}
